#pragma once
#include <vector>
#include <functional>
#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <ctime>

// 包装器 + lambda函数 设计Signal选项
std::function<void(void)> PrintLog = [](){ std::cout << "这是一个打印日志的任务" << std::endl; }; /* 打印日志 */
std::function<void(void)> DownLoad = [](){ std::cout << "这是一个下载的任务" << std::endl; }; /* 打印日志 */
std::function<void(void)> UpLoad = [](){ std::cout << "这是一个上传的任务" << std::endl; }; /* 打印日志 */


class SignalManage
{
    typedef std::function<void(void)> SL;
public:
    SignalManage()
    {
        /* 获取一个随机的种子 */
        srand(time(nullptr));
    }

    int SelectCode()
    {
        return rand() % _signal.size();
    }

    /* 选取并且执行一个任务 */
    void Execute(int code)
    {
        if(code >= 0 && code < _signal.size())
            _signal[code]();
    }

    void InsertToSl(SL sl)
    {
        _signal.emplace_back(sl);
    }


    ~SignalManage()
    {}
private:
    std::vector<SL> _signal;    /* 用于管理Signal */
};